﻿#define _CRT_SECURE_NO_WARNINGS
// ↑ 将本行在代码放在第一行可以避免 scanf的报错问题（仅在VS编译器里）
//【初阶篇】49.函数_作业
//【初阶篇】50.休息
//【初阶篇】51.函数_作业
//【初阶篇】52.休息
//【初阶篇】53.函数_作业
//【初阶篇】54.数组

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<string.h>


//3个数字从大到小排序，嵌套交换变量swap，需要提前声明
void swap(int*, int*);
void sort_3nums_LargeToSmall(int* px, int* py,int *pz)
{
	if (*px < *py)
		swap(px, py);
	if (*px < *pz)
		swap(px, pz);
	if (*py < *pz)
		swap(py, pz);
}
//交换两个变量的值
void swap(int* px, int* py)
{
	int n = *px;
	*px = *py;
	*py = n;
}
//辗转相除法求最大公约数，递归
int max_CommonDivisor(int x, int y)
{
	if (x % y != 0)
	{
		return max_CommonDivisor(y, x % y);
	}
	else
	{
		return y;
	}
}


int main()
{

	//作业1
	{
		printf("作业1:将三个整数从大到小输出\n");
		int a = 0;
		int b = 0;
		int c = 0;
		//输入
		printf("请输入三个数字，用空格隔开:>");
		scanf("%d %d %d", &a, &b, &c);
		//执行
		/*if (a < b)
		{
			swap(&a, &b);
		}
		if (a < c);
		{
			swap(&a, &c);
		}
		if (b < c);
		{
			swap(&b, &c);
		}*/
		sort_3nums_LargeToSmall(&a, &b, &c);
		//输出
		printf("%d %d %d", a, b, c);
		Sleep(2000);
		system("cls");
	}
	//-------------

	//作业2
	{
		printf("作业2:打印1-100之间的所有三倍数字\n");
		int i = 0;
		for (i = 1; i <= 100; i++)
		{
			if (i % 3 == 0)
			{
				printf("%d ", i);
			}
		}
		printf("\n更快的方式，3开始+=3，甚至不用判断\n");
		for (i = 3; i <= 100; i += 3)
		{
			printf("%d ", i);
		}
		Sleep(2000);
		system("cls");
	}
	//-------------

	//作业3
	{
		printf("作业3:给定两个数求两个数的最大公约数\n");
		int a = 0;
		int b = 0;
		//输入
		printf("请输入两个数字，用空格隔开:>");
		scanf("%d %d", &a, &b);
		//执行
		//通用方式
		int min = a < b ? a : b;
		int m = min;
		while (m >= 1)
		{
			if (a % m == 0 && b % m == 0)
			{
				//printf("最大公约数为%d", m);
				break;
			}
			m--;
		}
		//输出
		printf("最大公约数为%d\n", m);
		
		//辗转相除法
		/*int c = 0;
		while (c = a % b)
		{
			a = b;
			b = c;
		}
		printf("辗转相除法，最大公约数为%d\n", b);*/
		
		printf("辗转相除法最大公约数(递归函数)%d\n", max_CommonDivisor(a, b));
		printf("最小公倍数即为(a*b)/ max_commondivisor(a, b)=%d\n", (a * b) / max_CommonDivisor(a, b));
		Sleep(2000);
		system("cls");
	}
	//-------------
	
	//作业4
	{
		printf("作业4:数一下1-100中的整数出现多少个数字9\n");
		int i = 0;
		int count = 0;
		for (i = 1; i <= 100; i++)
		{
			if (i / 10 == 9 )
			{
				count++;
				printf("%d ", i);
			}
			if (i % 10 == 9)//99是算2次，所以个位十位要单独判断
			{
				count++;
				printf("%d ", i);
			}
		}
		printf("\n%d", count);
		Sleep(2000);
		system("cls");
	}
	//-------------

	//作业5
	{
		printf("作业5:计算1/1-1/2+1/3-1/4...+1/99-1/100的值\n");
		int i = 0;
		double sum5 = 0.0;
		for (i = 1; i <= 100; i++)
		{
			if (i % 2 == 0)
			sum5 = sum5 - 1.0 / i;
			else
			sum5 = sum5 + 1.0 / i;
		}
		printf("%lf\n", sum5);
		//更简单高效的方式，不用判断
		sum5 = 0.0;
		int j = 1;
		for (i = 1; i <= 100; i++)
		{
			sum5 += j * (1.0 / i);
			j = -j;
		}
		printf("%lf\n", sum5);
		Sleep(2000);
		system("cls");
	}
	//-------------

	//作业6
	{
		printf("作业6:求10个整数最大值\n");
		int arr[10] = { 1,2,3,4,5,612,24,56,7,224 };
		int i = 0;
		int max = arr[0];
		for (i = 1; i < 10; i++)
		{
			if (arr[i] > max)
				max = arr[i];
		}
		printf("%d", max);
	  Sleep(2000);
		system("cls");
	}
	//-------------

	//作业7
	{
		printf("作业7:打印99乘法口诀表\n");
		int i = 1;
		int j = 1;
		for (i = 1; i <= 9; i++)
		{
			for (j = 1; j <= i; j++)
			{
				printf("【%d×%d=%-2d】", i, j, i * j);//%-2右对齐 %2左对齐
			}
			printf("\n");
		}
		Sleep(2000);
		system("cls");
	}
	//-------------

	//54.数组
	{
		printf("数组学习:\n");
		//创建
		int arr[10];
		//初始化
		int arr1[10] = { 1,2,3 };//不完全初始化，剩余元素默认0
		int arr2[] = { 1,2,3,4,5,6,7,8,9,10 };//未制定大小根据元素个数决定数组大小
		//一维数组使用
		//下标引用操作符[]，数组编号从0开始
		printf("3= %d\n", arr2[2]);
		//求元素数量:数组总大小除以一个元素的大小
		int sz = sizeof(arr2) / sizeof(arr[0]);
		//打印数组元素的地址//数组中的元素是连续存放的，地址也是连续的
		printf("&arr[4] = %p &arr[5] = %p", &arr[4], &arr[5]);//相邻元素地址相差4个字节的大小（x86）
	}



	return 0;
	

}

	//54.数组：一组相同类型元素的集合
		//数组创建方式 type_t arr_name [const_n]
		//数组创建方式 类型     数组名 [元素数量]
		//c99之后，数组大小可以是变量，目的是为了支持变长数组

